package edu.pucsp.predatorprey.simulador.java.posicao.impl;

import java.util.ArrayList;
import java.util.List;

/**
 * @author José Almada
 * @author Bruno Ortiz
 */
public enum Direcao {

	NORTE {
		@Override
		public List<Posicao> obterPosicoesPossiveis(Posicao posicaoReferencia) {
			List<Posicao> posicoes = new ArrayList<Posicao>();
			posicoes.add(new Posicao(posicaoReferencia.getX(), posicaoReferencia.getY() - 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() - 1, posicaoReferencia.getY() - 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() + 1, posicaoReferencia.getY() - 1));
			return posicoes;
		}

		@Override
		public Direcao inverso() {
			return SUL;
		}
	},
	LESTE {
		@Override
		public List<Posicao> obterPosicoesPossiveis(Posicao posicaoReferencia) {
			List<Posicao> posicoes = new ArrayList<Posicao>();
			posicoes.add(new Posicao(posicaoReferencia.getX() + 1, posicaoReferencia.getY()));
			posicoes.add(new Posicao(posicaoReferencia.getX() + 1, posicaoReferencia.getY() - 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() + 1, posicaoReferencia.getY() + 1));
			return posicoes;
		}

		@Override
		public Direcao inverso() {
			return OESTE;
		}
	},
	SUL {
		@Override
		public List<Posicao> obterPosicoesPossiveis(Posicao posicaoReferencia) {
			List<Posicao> posicoes = new ArrayList<Posicao>();
			posicoes.add(new Posicao(posicaoReferencia.getX(), posicaoReferencia.getY() + 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() - 1, posicaoReferencia.getY() + 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() + 1, posicaoReferencia.getY() + 1));
			return posicoes;
		}

		@Override
		public Direcao inverso() {
			return NORTE;
		}
	},
	OESTE {
		@Override
		public List<Posicao> obterPosicoesPossiveis(Posicao posicaoReferencia) {
			List<Posicao> posicoes = new ArrayList<Posicao>();
			posicoes.add(new Posicao(posicaoReferencia.getX() - 1, posicaoReferencia.getY()));
			posicoes.add(new Posicao(posicaoReferencia.getX() - 1, posicaoReferencia.getY() - 1));
			posicoes.add(new Posicao(posicaoReferencia.getX() - 1, posicaoReferencia.getY() + 1));
			return posicoes;
		}

		@Override
		public Direcao inverso() {
			return LESTE;
		}
	};

	public abstract List<Posicao> obterPosicoesPossiveis(Posicao posicaoReferencia);

	public abstract Direcao inverso();

}
